# Устройство движка #

Боевой движок реализован в виде программы, написанной на Си. Со стороны PHP к нему прикручен скрипт battle.php, который подготавливает данные для боя, передает их боевому движку, а также обрабатывает результаты боя и генерирует боевые доклады.

## Алгоритм работы ##

  * Боевой движок использует файлы для передачи исходных данных и возвращения результата

  * После того, как сработало событие `Атака`, скрипт battle.php подготавливает исходные данные битвы и создает файл в папке /game/battledata/battle\_xxx.txt, где xxx - battle\_id.

  * Затем через командную строку запускается программа боевого движка с параметром : battle\_id.

  * Боевой движок загружает исходные данные из файла и конвертирует их в двоичный формат, после чего производится расчёт боя.

  * Результаты расчётов заносятся в выходной файл /game/battleresult/battle\_xxx.txt и боевой движок завершает свою работу.

  * Скрипт battle.php используя данные расчётов из файла в папке battleresult генерирует боевые доклады и вносит изменения в аккаунты игроков.

## Формат входных данных ##

Входные данные содержат исходные параметры битвы в текстовом формате.
Для удобства разбора в Си, значения представлены в формате "переменная = значение".

```
Rapidfire = 1
FID = 30
DID = 0
Attackers = N
Defenders = M
AttackerN = (<NAME> ID G S P WEAP SHLD ARMR MT BT LF HF CR LINK COLON REC SPY BOMB SS DEST DS BC)
DefenderM = (<NAME> ID G S P WEAP SHLD ARMR MT BT LF HF CR LINK COLON REC SPY BOMB SS DEST DS BC RT LL HL GS IC PL SDOM LDOM)
```

Rapidfire - 1: включить скорострел, 0 - без скорострела<br>
FID - количество выпадения флота в обломки, в процентах<br>
DID - количество выпадения обороны в обломки, в процентах<br>

Attacker - количество атакующих слотов (N = 1...MAX)<br>
Defenders - количество обороняющихся слотов (M = 1...MAX)<br>
(обычно не более 16 слотов, но может зависеть от настроек вселенной)<br>
<br>
для каждого атакера и дефа соответствующие строки Attacker0, Attacker1, Defender0 итд. счёт ведется с нуля.<br>
<br>
NAME - имя игрока (для боевого доклада, в расчётах не используется)<br>
ID - ID планеты/флота, которым принадлежит слот, в расчётах не используется<br>
G,S,P - координаты (для боевого доклада, в расчётах не используется)<br>

WEAP - уровень Оружейной технологии<br>
SHLD - уровень Щитовой технологии<br>
ARMR - уровень Брони <br>

Количество флота соотв. типа:<br>
MT - малый транспорт<br>
BT - большой транспорт<br>
LF - легкий истребитель<br>
HF - тяжелый истребитель<br>
CR - крейсер<br>
LINK - линкор<br>
COLON - колонизатор<br>
REC - переработчик<br>
SPY - шпионский зонд<br>
BOMB - бомбардировщик<br>
SS - солнечный спутник<br>
DEST - уничтожитель<br>
DS - звезда смерти<br>
BC - линейный крейсер<br>

Количество обороны соотв. типа:<br>
RT - ракетная установка<br>
LL - легкий лазер<br>
HL - тяжелый лазер<br>
GS - гаусс<br>
IC - ионная пушка<br>
PL - плазма<br>
SDOM - малый купол<br>
LDOM - большой купол<br>

<h2>Формат выходных данных</h2>

Выходные данные представлены в формате для PHP-функции unserialize().<br>
<br>
Формат (после преобразования unserialize()):<br>
<br>
<pre><code>Array (<br>
   'result' =&gt; 'awon' (Атакующий выиграл), 'dwon' (Обороняющийся выиграл), 'draw' (Ничья)<br>
   'dm' =&gt; количество металла в Поле обломков<br>
   'dk' =&gt; количество кристалла в Поле обломков<br>
<br>
   'before' =&gt; Array (  // Флоты перед боем<br>
            'attackers' =&gt; Array (    // слоты атакующих<br>
                  [0] =&gt; Array ( 'name' =&gt; имя игрока, 'id'=&gt;100002, 'g' =&gt; 1, 's' =&gt; 2 'p' =&gt; 3, 'weap' =&gt; 10, 'shld' =&gt; 11, 'armr' =&gt; 12, 202=&gt;5, 203=&gt;6, ... ),   // флоты<br>
                  [1] =&gt; Array ( ... )<br>
            )<br>
<br>
            'defenders' =&gt; Array (    // слоты обороняющихся<br>
                  [0] =&gt; Array ( 'name' =&gt; имя игрока, 'id'=&gt;100006, 'g' =&gt; 1, 's' =&gt; 2 'p' =&gt; 3, 'weap' =&gt; 10, 'shld' =&gt; 11, 'armr' =&gt; 12, 202=&gt;5, 203=&gt;6, ..., 401=&gt;5, 402=&gt;44 ),   // флоты и оборона<br>
                  [1] =&gt; Array ( ... )<br>
            )<br>
<br>
   )<br>
<br>
   'rounds' =&gt; Array (  // Раунды<br>
       [0] =&gt; Array (<br>
            'ashoot' =&gt; Атакующий флот делает: 988 выстрела(ов)<br>
            'apower' =&gt; общей мощностью 512.720.100<br>
            'dabsorb' =&gt; Щиты обороняющегося поглощают 43.724<br>
            'dshoot' =&gt; Обороняющийся флот делает 1.651 выстрела(ов)<br>
            'dpower' =&gt; общей мощностью 428.728<br>
            'aabsorb' =&gt; Щиты атакующего поглощают 355.453<br>
<br>
            'attackers' =&gt; Array (    // слоты атакующих<br>
                  [0] =&gt; Array ( 'name' =&gt; имя игрока, 'id'=&gt;100002, 'g' =&gt; 1, 's' =&gt; 2 'p' =&gt; 3, 202=&gt;5, 203=&gt;6, ... ),   // флоты<br>
                  [1] =&gt; Array ( ... )<br>
            )<br>
<br>
            'defenders' =&gt; Array (    // слоты обороняющихся<br>
                  [0] =&gt; Array ( 'name' =&gt; имя игрока, 'id'=&gt;100006, 'g' =&gt; 1, 's' =&gt; 2 'p' =&gt; 3, 202=&gt;5, 203=&gt;6, ..., 401=&gt;5, 402=&gt;44 ),   // флоты и оборона<br>
                  [1] =&gt; Array ( ... )<br>
            )<br>
<br>
       ),<br>
       [1] =&gt; Array ( ... )   // следующий раунд<br>
   )<br>
)<br>
</code></pre>

Для атакующих и защитников 1...m - id это fleet_id их флотов. Для обороняющегося #0 id это planet_id его планеты.<br>
<br>
Расчёт захваченных ресурсов, восстановленной обороны и шанс возникновения луны (и её создание) производится скриптом battle.php, на основании полученных данных.